package com.kun.kunnmall.secikll.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * spring原生的定时任务（@EnableScheduling+@Scheduled），自动配置类TaskSchedulingAutoConfiguration
 * spring原生的异步任务（@EnableAsync + @Async），自动配置类TaskExecutionAutoConfiguration
 */
@Slf4j
@EnableScheduling
@Component
@EnableAsync
public class HelloSchedule {

    /**
     * spring中默认6位组成，不允许出现年份
     * 定时任务不应该阻塞，一个定时任务超时了，不应该阻碍其他定时任务。但是定时任务默认是阻塞的
     * 解决方案：
     * 1. 可以让业务以异步的方式，自己提交到线程池
     * 2. spring定时任务线程池默认只有一个线程，这也是它会产生阻塞的原因，但是我们可以自己手动设置线程池里面的线程数量
     * 3. 可以直接让定时任务以异步的方式来运行
     * 最终选择使用异步+定时任务来实现定时任务不阻塞
     */
    @Async
    @Scheduled(cron = "*/5 * * ? * 7")
    public void hello() throws InterruptedException {
        log.info("hello......");
        Thread.sleep(3000);
    }
}
